/**
 * @file SocketIO.hpp
 * @brief Socket IO操作类的声明
 * @details 封装了socket的读写操作，提供可靠的数据传输接口
 */

#ifndef __SocketIO_HPP__
#define __SocketIO_HPP__
#include "Packet.hpp"
#include "logger.hpp"

namespace wd
{

/**
 * @class SocketIO
 * @brief Socket IO操作类
 * @details 封装socket的读写操作，支持按行读取和按包读取
 */
class SocketIO
{
public:
    /**
     * @brief 构造函数
     * @param fd socket文件描述符
     */
    explicit
    SocketIO(int fd)
    : _fd(fd)
    {}
    
    /**
     * @brief 查看内核接收缓冲区数据（不移除）
     * @param buff 缓冲区
     * @param len 缓冲区长度
     * @return 实际查看的字节数
     */
    int recvPeek(char * buff, int len) const;
    
    /**
     * @brief 确保发送len个字节的数据
     * @param buff 数据缓冲区
     * @param len 数据长度
     * @return 实际发送的字节数
     */
    int sendn(const char * buff, int len) const;
    
    /**
     * @brief 确保接收len个字节的数据
     * @param buff 数据缓冲区
     * @param len 期望接收的长度
     * @return 实际接收的字节数
     */
    int readn(char * buff, int len) const;
    
    /**
     * @brief 每次接收一行数据（以'\n'为界）
     * @param buff 缓冲区
     * @param maxlen 缓冲区最大长度
     * @return 实际读取的字节数
     */
    int readline(char * buff, int maxlen) const;
    
    /**
     * @brief 读取网络二进制数据为Packet
     * @param packet 用于存储读取的数据包
     * @return 读取的字节数
     */
    int readPacket(Packet &packet);
    
private:
    int _fd;  ///< socket文件描述符
};

}//end of namespace wd


#endif

